home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / src / DiskTools / corewfiles.asm < prev    next >
Assembly Source File  |  2000-04-12  |  2KB  |  149 lines

  1. ; *** Core Design disk utility V1.0
  2. ; *** Written by Jean-François Fabre
  3.  
  4.     include    "libs.i"
  5.     include    "macros.i"
  6.  
  7.     XREF    _SysBase
  8.  
  9.     XDEF    _WriteFiles
  10.     XDEF    @WriteFiles
  11.  
  12.  
  13. ; *** create several files from the disk image
  14. ; *** very intricate routine, sorry
  15.  
  16. ; in: A0/stack: diskfile buffer
  17. ; out D0: error flag (0=OK)
  18.  
  19. _WriteFiles:
  20.     move.l    4(A7),A0
  21. @WriteFiles:
  22.     movem.l    D1-A6,-(sp)
  23.     move.l    A0,DiskBuffer
  24.  
  25.     lea    dosname,A1
  26.     moveq    #0,D0
  27.     move.l    _SysBase,A6
  28.     JSRLIB    OpenLibrary
  29.     move.l    D0,dosbase
  30.     beq    WF_UN_Error
  31.  
  32.     move.l    DiskBuffer,A0
  33.     lea    $200(A0),A2    ; for directory block list, constant
  34.  
  35. wfloop$:
  36.     tst.b    (A2)
  37.     beq    WF_OK    ; end
  38.  
  39.     ; *** get the file size and first sector
  40.  
  41.     moveq.l    #0,D4
  42.     moveq.l    #0,D5
  43.  
  44.     move.l    ($10,A2),D6    ; file size
  45.     move.w    ($14,A2),D4    ; track
  46.     move.w    ($16,A2),D5    ; sector
  47.  
  48.     ; ** open the first file
  49.  
  50.     move.l    A2,D1        ; pointer on the file name to create
  51.     lea    ($20,A2),A2    ; for next time
  52.     move.l    #MODE_NEWFILE,D2
  53.     move.l    dosbase,A6
  54.     movem.l    D1-A6,-(sp)
  55.     JSRLIB    Open        ; open a new file
  56.     movem.l    (sp)+,D1-A6
  57.     move.l    D0,FHandle
  58.     beq    WF_CF_Error
  59.  
  60. loop2$
  61.     ; *** get offset for a sector
  62.  
  63.     bsr    GetOffset
  64.     moveq.l    #0,D4
  65.     moveq.l    #0,D5
  66.     move.w    (A3)+,D4
  67.     move.w    (A3)+,D5    ; next track/sector
  68.  
  69.     move.l    #$1FC,D3    ; length if file still to read
  70.     cmp.l    D3,D6
  71.     bcc    writewhole$    
  72.     move.l    D6,D3        ; only writes D6 bytes (<$1FC)
  73. writewhole$
  74.  
  75.     ; *** write some data to the file
  76.  
  77.     move.l    FHandle,D1
  78.     move.l    A3,D2        ; buffer
  79.     move.l    dosbase,A6
  80.     movem.l    D1-A6,-(sp)
  81.     JSRLIB    Write
  82.     movem.l    (sp)+,D1-A6
  83.  
  84.     sub.l    D3,D6        ; length remaining to be read
  85.     beq    close$
  86.     bcc    loop2$
  87.  
  88.     ; *** close the file
  89. close$
  90.     move.l    FHandle,D1
  91.     move.l    dosbase,A6
  92.     movem.l    D1-A6,-(sp)
  93.     JSRLIB    Close
  94.     movem.l    (sp)+,D1-A6
  95.     clr.l    FHandle
  96.  
  97.     bra    wfloop$
  98.  
  99. WF_OK:
  100.     moveq.l    #0,D0
  101. WF_Exit:
  102.     move.l    dosbase,D1
  103.     beq    fuck$
  104.     move.l    D1,A1
  105.     move.l    _SysBase,A6
  106.     JSRLIB    CloseLibrary
  107.     move.l    #0,dosbase
  108. fuck$
  109.     movem.l    (sp)+,D1-A6
  110.     rts
  111.  
  112.  
  113. WF_CF_Error:
  114.     moveq.l    #-1,D0
  115.     bra    WF_Exit
  116.  
  117. WF_UN_Error:
  118.     moveq.l    #-2,D0
  119.     bra    WF_Exit
  120.  
  121. WF_DC_Error:
  122.     moveq.l    #-3,D0
  123.     bra    WF_Exit
  124.  
  125. WF_AM_Error:
  126.     moveq.l    #-5,D0
  127.     bra    WF_Exit
  128.  
  129. GetOffset:
  130.     move.l    A0,A3
  131.     subq.l    #1,D4        ; because we did not rip track 0 (dos boot)
  132.     mulu    #$B,D4        ; 1 track = 11 sectors
  133.     add.l    D5,D4
  134.     lsl.l    #8,D4        ; * $100
  135.     add.l    D4,D4        ; * $200: offset in bytes
  136.     add.l    D4,A3
  137.     rts
  138.     
  139. filesize:
  140.     dc.l    0
  141. DiskBuffer:
  142.     dc.l    0
  143. FHandle:
  144.     dc.l    0
  145. dosbase:
  146.     dc.l    0
  147. dosname:
  148.     dc.b    "dos.library",0
  149.